package com.efrei.schoolmanager.model.hibernate.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.model.dao.HibernateDAO;
import com.efrei.schoolmanager.model.obj.Classe;
import com.efrei.schoolmanager.model.obj.Eleve;

/**
 * DAO pour les classes avec hibernate
 * 
 */
public class ClasseDAO extends HibernateDAO<Classe> {

	public ClasseDAO(Session session) {
		super(session, Classe.class);
	}

	public List<Classe> getClasses() {
		return content("FROM Classe ORDER BY promotion, niveau, nom");
	}

	/**
	 * recherche la classe en base
	 * 
	 * @param nom
	 * @param promotion
	 * @param niveau
	 * @return Classe
	 * @throws LogicException
	 */
	@SuppressWarnings("unchecked")
	public Classe searchClasse(String nom, int promotion, String niveau)
			throws LogicException {
		String hql = "SELECT c FROM Classe c JOIN c.niveau WHERE c.nom = :nom "
				+ "AND c.promotion = :promotion AND c.niveau.nom = :niveau";
		// creation requete et affectations
		List<Classe> classes = getSession().createQuery(hql)
				.setString("nom", nom).setInteger("promotion", promotion)
				.setString("niveau", niveau).list();
		if (classes.size() == 0)
			throw new LogicException("classe non trouvée en base");
		return classes.get(0);
	}

	/**
	 * rajoute l'eleve a la classe donnée. <br/>
	 * lourd en requete sql, mieux vaut faire update(classe) soit même
	 * 
	 * @param promotion
	 * @param classeNom
	 * @param matricule
	 */
	public void addEleve(int promotion, String classeNom, String matricule) {
		Session session = getSession();

		// recup classe comme proxy
		Query getClasse = session
				.createQuery(
						"SELECT c.classeId FROM Classe c"
								+ " WHERE c.promotion = :promotion"
								+ " AND c.nom = :classeNom")
				.setInteger("promotion", promotion)
				.setString("classeNom", classeNom);
		Classe classe = (Classe) session.load(getType(), (Integer) getClasse
				.list().get(0));

		// recuperation de l'id de l'eleve
		Query getEleve = session.createQuery(
				"SELECT e.eleveId FROM Eleve e WHERE e.matricule = :matricule")
				.setString("matricule", matricule);
		Eleve eleve = (Eleve) session.load(Eleve.class, (Integer) getEleve
				.list().get(0));

		// et ajout de l'eleve
		classe.getEleves().add(eleve);
	}
}
